package com.itany.corejava.code13_jdbc;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @author MissChen
 * @date 2024年03月21日 9:53
 */
public class Test01_快速入门 {
    public static final String JDBC_URL = "jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8";

    public static void main(String[] args) {
        User user = new User("cici", "123", "13587452361", "上海");
        insertUser(user);
        // User user = new User(1,"guziyang", "123456", "13587452311", "beijing");
        // updateUser(user);
        //
        // List<User> users=selectAll();
        // System.out.println(users);

        // deleteById(2);
    }

    /**
     * 添加用户信息
     * @param user
     */
    public static void insertUser(User user) {

        Connection conn = null;
        Statement st = null;

        try {
            // 1.注册驱动：注册由数据库厂商提供的驱动
            // 根据数据库类型不同，版本不同，驱动所在包名与类名都有可能不同
            // 此处以MySQL5的版本为例
            // 注册驱动是通过反射来实现
            // Class.forName("包名.类名")来注册驱动
            Class.forName("com.mysql.jdbc.Driver");

            // 2.获取连接，链接到指定的数据库中，由数据库厂商提供连接方式
            // DriverManager.getConnection(url,username,password)
            // 参数一:链接到数据库的url地址
            // 对于MySQL而言，其url地址格式为:    jdbc:mysql://mysql服务的ip地址:端口号/库名
            // ip地址指的是MySQL服务器所在的计算机的ip地址,可以使用本机地址:127.0.0.1或者localhost
            // 端口号默认是:3306
            // 在java访问数据库时，可能会出现乱码问题
            // 在url末尾指定编码:  ?useUnicode=true&characterEncoding=utf-8
            // 参数二:MySQL的账号
            // 参数三:MySQL的密码

            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8", "root", "root");


            // 3.获取状态集,用于操作数据库
            st = conn.createStatement();

            // 4.执行sql
            String sql = "insert into t_user (username,password,phone,address) values ('" + user.getUsername() + "','" + user.getPassword() + "','" + user.getPhone() + "','" + user.getAddress() + "')";

            //执行DML操作:增删改查
            //返回值：收到影响的数据行数
            int row = st.executeUpdate(sql);

            System.out.println("Query OK" + row + "  rows affected");


        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("找不到驱动");
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("数据库访问失败");
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放资源出错");
                }
            }
            if (st != null) {
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放资源出错");
                }
            }
        }


    }

    /**
     * 修改用户
     * @param user
     */
    public static void updateUser(User user) {
        Connection conn = null;
        Statement st = null;

        try {
            // 1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 2.获得连接
            conn = DriverManager.getConnection(JDBC_URL, "root", "root");
            // 3.获取状态集，用于操作数据库
            st = conn.createStatement();
            //4.定义执行的sql
            String sql = "update t_user set username='" + user.getUsername() + "',password='" + user.getPassword() + "',phone='" + user.getPhone() + "',address='" + user.getAddress() + "' where id=" + user.getId();
            //5.执行DML操作
            int rows = st.executeUpdate(sql);


            System.out.println("Query OK " + rows + " rows affected");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("找不到驱动");
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("数据库访问失败");
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放资源出错");
                }
            }
            if (st != null) {
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放资源出错");
                }
            }
        }
    }

    /**
     * 查询用户信息
     * @return
     */
    public static List<User> selectAll() {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
        List<User> users = new ArrayList<>();
        try {
            // 1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");

            // 2.获取连接
            conn = DriverManager.getConnection(JDBC_URL, "root", "root");

            // 3.获取状态集
            st = conn.createStatement();

            //4.定义执行sql
            String sql = "select id,username,phone,password,address from t_user";

            //5.执行查询操作,此时方法返回的是数据库查询的结果集，在JDBC中，数据库查询的结果集由数据库厂商封装成ResultSet对象
            rs = st.executeQuery(sql);

            // 6.处理结果集
            // 将数据库查询的结果映射成Java对象，查询的结果集每一行数据映射成一个Java对象，如果存在多行数据，映射的是一个Java对象集合
            // ResultSet对象提供的了next()方法，用于读取下一行数据，判断下一行是否有数据，如果有数据将这一行数据映射成一个Java对象
            while (rs.next()) {
                //只要有下一行数据，需要处理，直到下一行没有数据为止
                User user = new User();
                //通过结果集提供的getXxx(int columnIndex) 或者getXxx(String columnLabel)来进行转换
                // getXxx(int columnIndex)：获取第几列的数据
                // getXxx(String columnLabel)：获取指定列名的数据
                int id = rs.getInt(1);
                user.setId(id);
                String username = rs.getString("username");
                user.setUsername(username);
                user.setPassword(rs.getString("password"));
                user.setPhone(rs.getString("phone"));
                user.setAddress(rs.getString("address"));
                users.add(user);

            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放资源出错");
                }
            }
            if (st != null) {
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放资源出错");
                }
            }
            if(rs!=null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放资源出错");
                }
            }

        }
        return users;
    }

    public static void deleteById(Integer id){
        Connection conn=null;
        Statement st=null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn=DriverManager.getConnection(JDBC_URL,"root","root");
            st=conn.createStatement();
            String sql="delete from  t_user where id="+id;
            int rows=st.executeUpdate(sql);
            System.out.println("删除成功,"+rows +"行受影响");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            if(conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(st!=null){
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}
